#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <string>
#include <cstdio>
#include <ctime>
#include <cstdlib>
using namespace std;

// 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void* threadRoutine(void* args)
{
    pthread_mutex_lock(&mutex);

    cout << "I am a new thread" << endl;

    pthread_mutex_lock(&mutex);
}

int main()
{
    pthread_t t;
    pthread_create(&t,nullptr,threadRoutine,nullptr);

    // sleep(3);
    // pthread_mutex_unlock(&mutex);

    pthread_join(t,nullptr);


    return 0;
}


// void *new_run(void *arg)
// {
//     int cnt = 5;
//     while (cnt--)
//     {
//         cout << "I am new new thread, cnt: " << cnt << endl;
//         sleep(1);
//     }
//     pthread_detach(pthread_self());//detach要在join之前设定，否则是无效的
//     cout << "new new detach" << endl;
//     return nullptr;
// }

// void *run(void *arg)
// {
//     // pthread_detach(pthread_self()); //在新线程中detach自己
//     // int cnt = 10;
//     // while(cnt--)
//     // {
//     //     cout << "I am new thread, cnt: " << cnt << endl;
//     //     sleep(1);
//     // }
//     // pthread_exit(nullptr);
//     while (true)
//     {
//         cout << "I am new thread" << endl;
//         sleep(1);
//     }
//     pthread_exit(nullptr);
// }

// int main()
// {
//     cout << "I am main thread" << endl;

//     pthread_t tid;
//     pthread_create(&tid, nullptr, run, nullptr);

//     // pthread_detach(tid);
//     sleep(3);
//     pthread_cancel(tid);

//     void *ret = nullptr;
//     int n = pthread_join(tid, &ret);
//     if (n != 0)
//     {
//         cout << "join new thread fail!!" << endl;
//         exit(1);
//     }
//     if (ret == PTHREAD_CANCELED)
//     {
//         cout << "new thread is canceled" << endl;
//     }
//     cout << "join new thread success!!" << endl;

//     return 0;
// }

// 用户级线程 test
// __thread int g_val = 0;
// int g_val = 0;


// string toHex(pthread_t tid)
// {
//     char buf[64];
//     snprintf(buf, sizeof(buf), "0x%x", tid);
//     return string(buf);
// }

// void *run(void *arg)
// {
//     // cout << "g_val: " << ++g_val << " " << "&g_val: " << &g_val << endl;
//     for(int i = 0; g_val < 10000; i++)
//     {
//         ++g_val;
//     }
//     pthread_exit(nullptr);
// }

// int main()
// {
//     pthread_t t1;
//     pthread_t t2;

//     pthread_create(&t1, nullptr, run, nullptr);
//     pthread_create(&t2, nullptr, run, nullptr);

//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);

//     cout << g_val << endl;
//     return 0;
// }

//线程demo

// #include "Thread.hpp"

// void* run(void* arg)
// {
//     cout << "I am new thread" << endl;
// }

// int main()
// {
//     Thread t(0,run,nullptr);

//     t.run();



//     t.join();

//     return 0;
// }

